package days10.preview;

/**
 * 内部类访问外部类的成员特点。
 * 遵循就近原则。
 * 结论： 按照就近原则访问。 比如外部类有，内部类有，局部变量有。
 * 则访问的时候，访问的是局部变量的。  如果想访问外部类的，使用 外部类类名.this.变量； 如果想访问内部类的，使用 this.变量
 */

public class Demo4 {
    public static void main(String[] args) {
        // 内部类和外部类。 内部类是依赖与外部类存在的。也就是只有新建外部类，才能创建内部类
        Outer31.Inner31 inner31 = new Outer31().new Inner31();

        inner31.test1();
        System.out.println("========================");
        inner31.test2();
    }
}
class Outer31 {
    String f1 = "outer f1";
    String f2 = "outer f2";
    String m1 = "outer m1";

    class Inner31 {
        String f2 = "inner f2";
        String m1 = "inner m1";

        public void test1() {
            String m1 = "test1 m1";
            // 访问外部类成员，直接写名字即可。即使是private修饰符。
            // 就近原则。局部变量有这个变量，就使用成员变量的； 如果成员变量有这个就使用的是成员变量； 否则就使用外部类的
            System.out.println(f1); // outer f1
            System.out.println(Inner31.this.f2); // inner f2
            System.out.println(Outer31.this.f2); // outer f2
            System.out.println(m1); // test1 m1
        }

        public void test2() {

            String m1 = "test1 m1";

            // 如果想使用外部类的。 在内部类或者局部变量没有这个变量的时候，可以直接使用变量名即可
            // 可以使用  外部类类名.this.变量名 去访问外部类的成员变量
            System.out.println(Outer31.this.f2); // outer f2
            System.out.println(this.m1); // inner m1

        }
    }
}